perm filename PIXNIC.SAI[VIS,HPM]6 blob
sn#153533 filedate 1975-04-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE
C00003 00003 INTEGER PROCEDURE PFLDIM(STRING FILNAM)
C00008 00004 INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS)
C00010 00005 INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE STRING FILNAM)
C00013 00006 INTEGER PROCEDURE CAMPIX(INTEGER CAM,YEDGE,XEDGE,SUMS,CLPINC
C00016 00007 DEFINE PCLN=0 comment index of word in a picture file containing
C00018 ENDMK
C⊗;
REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE;
REQUIRE "TVSIX.REL[1,PDQ]" LOAD_MODULE;
EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);
EXTERNAL INTEGER PROCEDURE PIXEL(REFERENCE INTEGER PIX; INTEGER I,J);
EXTERNAL PROCEDURE PUTEL(REFERENCE INTEGER PIX; INTEGER I,J,VALUE);
INTEGER PROCEDURE PFLDIM(STRING FILNAM);
comment returns the size of the picture FILNAM on disk.
used for allocating arrays in preparation for
actually reading them. Returns 0 on failure.;
BEGIN
INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER ARRAY BUF[0:'177];
STRING PROCEDURE DEV(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
T←"";
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
END;
STRING PROCEDURE NAM(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
END;
OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
LOOKUP(10,NAM(FILNAM),XXFLAG);
IF XXFLAG THEN
BEGIN
CLOSE(10);
RETURN(0);
END
ELSE
BEGIN
INTEGER K,KK;
ARRYIN(10,BUF[0],'200); CLOSE(10);
KK←0;
FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
IF BUF[0]≠-1 ∨ KK=0 THEN RETURN(0);
BYBI←BUF[1];
LNBY←BUF[6]-BUF[5]+1;
PCLN←BUF[4]-BUF[3]+1;
LNWD←BUF[2];
LNBYA←LNWD*(36%BYBI);
PCWD←LNWD*PCLN;
XXPICLOC←(BUF[KK] LAND '777777)-'200;
RETURN(12+PCLN+LNBYA+PCWD);
END;
END;
INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
comment read the picture in file FILNAM into area of core whose first
word is PICTURE. PFLDIM(FILNAM) words are needed.
Returns picture size of success, 0 on failure.;
BEGIN
INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER I,L;
INTEGER ARRAY BUF[0:'177];
STRING PROCEDURE DEV(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
T←"";
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
END;
STRING PROCEDURE NAM(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
END;
OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
LOOKUP(10,NAM(FILNAM),XXFLAG);
IF XXFLAG THEN
BEGIN
CLOSE(10);
RETURN(0);
END
ELSE
BEGIN
INTEGER K,KK;
ARRYIN(10,BUF[0],'200);
KK←0;
FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
IF BUF[0]≠-1 ∨ KK=0 THEN RETURN(0);
L←LOCATION(PICTURE);
MEMORY[L+9]←BYBI←BUF[1];
MEMORY[L+5]←LNBY←BUF[6]-BUF[5]+1;
MEMORY[L+0]←PCLN←BUF[4]-BUF[3]+1;
MEMORY[L+4]←LNWD←BUF[2];
MEMORY[L+7]←WDBY←36%BYBI;
MEMORY[L+6]←LNBYA←LNWD*WDBY;
MEMORY[L+1]←PCWD←PCLN*LNWD;
MEMORY[L+2]←PCBY←PCLN*LNBY;
MEMORY[L+3]←PCBYA←PCLN*LNBYA;
MEMORY[L+8]←WDBI←WDBY*BYBI;
MEMORY[L+10]←12+PCLN+L;
MAKTAB(PICTURE);
XXPICLOC←(BUF[KK] LAND '777777)-'200;
FOR I←1 STEP 1 UNTIL XXPICLOC DO WORDIN(10);
ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
CLOSE(10);
RETURN(12+PCLN+LNBYA+PCWD);
END;
END;
INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
comment returns the size of the array needed to hold a hypothetical
picture HEIGHT scanlines by WIDTH pixels per scanline
by BITS bits per pixel.;
BEGIN
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER L;
BYBI←BITS;
LNBY←WIDTH;
PCLN←HEIGHT;
WDBY←36%BYBI;
LNWD←(LNBY+WDBY-1)%WDBY;
LNBYA←LNWD*WDBY;
PCWD←PCLN*LNWD;
RETURN(12+PCLN+LNBYA+PCWD);
END;
INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
comment actually creates an empty picture HEIGHT by WIDTH by BITS in
the area of core beginning with PICTURE. Returns its size.;
BEGIN
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER I,L;
L←LOCATION(PICTURE);
MEMORY[L+9]←BYBI←BITS;
MEMORY[L+5]←LNBY←WIDTH;
MEMORY[L+0]←PCLN←HEIGHT;
MEMORY[L+7]←WDBY←36%BYBI;
MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
MEMORY[L+6]←LNBYA←LNWD*WDBY;
MEMORY[L+1]←PCWD←PCLN*LNWD;
MEMORY[L+2]←PCBY←PCLN*LNBY;
MEMORY[L+3]←PCBYA←PCLN*LNBYA;
MEMORY[L+8]←WDBI←WDBY*BYBI;
MEMORY[L+10]←12+PCLN+L;
MAKTAB(PICTURE);
RETURN(12+PCLN+LNBYA+PCWD);
END;
INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM);
comment write out the picture in the core area starting with
PICTURE, creating a file called FILNAM. Returns
the size of the original file on success, else 0.;
BEGIN
INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
INTEGER I,L;
INTEGER ARRAY BUF[0:'177];
STRING PROCEDURE DEV(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
T←"";
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
END;
STRING PROCEDURE NAM(STRING FILSPEC);
BEGIN
STRING S,T;
INTEGER I;
S←FILSPEC;
WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
END;
OPEN(10,DEV(FILNAM),'10,0,2,XXCOUNT,XXBRCHAR,XXEOF);
ENTER(10,NAM(FILNAM),XXFLAG);
IF XXFLAG THEN
BEGIN
CLOSE(10);
RETURN(0);
END
ELSE
BEGIN
L←LOCATION(PICTURE);
BUF[0]←-1;
BUF[1]←BYBI←MEMORY[L+9];
BUF[2]←LNWD←MEMORY[L+4];
BUF[3]←1; BUF[4]←PCLN←MEMORY[L+0];
BUF[5]←1; BUF[6]←LNBY←MEMORY[L+5];
BUF[7]←((-(PCWD←MEMORY[L+1])) LSH 18) LOR '200;
WDBY←36%BYBI;
LNWD←(LNBY+WDBY-1)%WDBY;
LNBYA←LNWD*WDBY;
ARRYOUT(10,BUF[0],'200);
ARRYOUT(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
CLOSE(10);
RETURN(12+PCLN+LNBYA+PCWD);
END;
END;
INTEGER PROCEDURE CAMPIX(INTEGER CAM,YEDGE,XEDGE,SUMS,CLPINC;
REFERENCE INTEGER PICTURE);
comment read a picture from camera CAM of size defined by array PICTURE
the area of core beginning with PICTURE. Upper left hand
corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
BEGIN
INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI,LINTAB;
INTEGER L;
EXTERNAL INTEGER ERROR,TVCAM;
L←LOCATION(PICTURE);
PCLN←MEMORY[L+0];
PCWD←MEMORY[L+1];
LNWD←MEMORY[L+4];
LNBY←MEMORY[L+5];
LNBYA←MEMORY[L+6];
BYBI←MEMORY[L+9];
LINTAB←MEMORY[L+11];
ERROR←1; TVCAM←CAM;
IF SUMS>1 ∨ CLPINC<8 ∨ BYBI≠4 THEN
BEGIN
comment use Quam's general picture taker;
EXTERNAL PROCEDURE TVSIX(INTEGER ARRAY PARS; INTEGER SUMS,CLPINC);
EXTERNAL PROCEDURE PICREL(INTEGER ARRAY PIC);
DEFINE SCALEX="0",SCALEY="1",POSX="2",POSY="3",SIZEX="4",SIZEY="5",
SIZEL="6",PTR="7",NAME="8",BIT="9",GAIN="10",OFFSET="11";
comment for interfacing quam internal format;
INTEGER ARRAY PIC[0:15];
PIC[POSX]←XEDGE; PIC[POSY]←YEDGE;
PIC[BIT]←BYBI;
PIC[SIZEX]←LNBY;
PIC[SIZEY]←PCLN;
PIC[SIZEL]←LNWD;
TVSIX(PIC,SUMS,CLPINC);
ARRBLT(MEMORY[LINTAB],MEMORY[PIC[PTR] LAND '777777],PCWD);
PICREL(PIC);
END
ELSE
BEGIN
EXTERNAL PROCEDURE TVIN;
EXTERNAL INTEGER BCLIP,TCLIP,FLINE,LLINE,LSIDE,RSIDE,TVWORD;
BCLIP←7; TCLIP←0;
FLINE←YEDGE; LLINE←FLINE+PCLN-1;
LSIDE←XEDGE; RSIDE←LSIDE+LNBY-1;
TVWORD←((-PCWD) LSH 18) LOR (LINTAB-1);
TVIN;
END;
RETURN(12+PCLN+LNBYA+PCWD);
END;
DEFINE PCLN=0; comment index of word in a picture file containing
number of scanlines in the picture.
DEFINE PCWD=1; comment number of words in the picture;
DEFINE PCBY=2; comment number of valid bytes in the picture;
DEFINE PCBYA=3; comment no. of bytes including the nulls at the end of lines;
DEFINE LNWD=4; comment no. of words per scanline;
DEFINE LNBY=5; comment no. of valid bytes per scanline;
DEFINE LNBYA=6; comment no. of bytes per scanline, including the nulls;
DEFINE WDBY=7; comment no. of bytes per word;
DEFINE WDBI=8; comment no. of bits containing data in a word;
DEFINE BYBI=9; comment no. of bits per byte;
DEFINE BPTAB=10; comment address of second entry in byte pntr. table;
DEFINE LINTAB=11; comment actual address of the first entry in the row table;